package de.guice.aktenschrank.crud;

import com.google.inject.AbstractModule;
import com.google.inject.matcher.Matchers;
import com.google.inject.name.Names;

import de.guice.aktenschrank.configuration.Annotation.Trace;
import de.guice.aktenschrank.entities.AkteData;
import de.guice.aktenschrank.entities.AkteDataProvider;
import de.guice.aktenschrank.logutil.LogInterceptor;

/**
 * Das DAO-Modul dient zum definieren der Beziehungen zwischen Interface und
 * Implementierung. Dies ist die zentrale Stelle, wo alle Informationen
 * zusammenlaufen.
 * 
 * @author Philippe Mitsch
 * 
 */
public class DAOModule extends AbstractModule {

	@Override
	protected void configure() {
		// Bindet Interface zu spezifischer Implementierung
		// anhand eines Provider-Bindings
		bind(AkteData.class).toProvider(AkteDataProvider.class);

		// Binde Interfaces zu spezifischen Implementierungen in einfacher Form (Linked Binding)
		bind(AkteDAO.class).to(AkteDAOFileImpl.class);
		bind(ConnectionManager.class).to(ConnectionManagerJDBCImpl.class);

		// Configuration !!!Instance Binding!!!
		bind(String.class).annotatedWith(Names.named("JDBC URL")).toInstance(
				"jdbc:mysql://localhost/guice");
		bind(String.class).annotatedWith(Names.named("JDBC USER")).toInstance(
				"guice");
		bind(String.class).annotatedWith(Names.named("JDBC PASSWORD"))
				.toInstance("verysecret");

		// AOP (trace logging)
		bindInterceptor(Matchers.any(), Matchers.annotatedWith(Trace.class), new LogInterceptor());
	}
}
